package com.liinxin.flac_management.utils;

import cn.hutool.core.io.FileUtil;
import cn.hutool.core.io.file.FileNameUtil;
import com.liinxin.flac_management.entity.Author;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

public class FileManage {
    /**
     * 遍历根目录, 获取每个作者
     *
     * @param rootPath
     */
    public static List<Author> listRootPath(File rootPath) {
        List<Author> authorList = new ArrayList<>();
        File[] rootList = FileUtil.ls(rootPath.getPath());
        // 遍历并将每个作者保存到author
        for (int i = 0; i < rootList.length; i++) {
            // 遍历每个作者的作品
            Author author = listAuthorPath(rootList[i]);

            // 将author添加到author集合
            authorList.add(author);
        }
        return authorList;
    }

    /**
     * 遍历作者目录, 获取作品(listRootPath)
     *
     * @param authorPath
     */
    public static Author listAuthorPath(File authorPath) {
        Author author = new Author();
        author.setAuthorFile(authorPath);
        // 遍历authorPath
        File[] ls = FileUtil.ls(authorPath.getPath());
        File[] works = new File[ls.length];
        for (int i = 0; i < ls.length; i++) {
            // 获取每个作品, 将作品存入author的作品里面
            works[i] = ls[i];
        }
        // System.out.println(works.length);
        author.setWorks(works);
        return author;
    }


    /**
     * 文件或文件夹重命名
     *
     * @param originFile
     * @param fileName
     * @return
     */
    public static File reFileName(File originFile, String fileName) {
        // 获取文件先前地址名
        String preOriginPath = getPrePath(originFile.getPath());

        String extName = "";
        // 判断是否是文件还是文件夹
        if (FileUtil.isFile(originFile)) {
            // 是文件获取文件扩展名
            extName = "." + FileNameUtil.extName(originFile);
        }

        File file = new File(preOriginPath + fileName + extName);
        boolean flag = originFile.renameTo(file);

        originFile = file;

        if (flag) {
            System.out.println("文件重命名成功");
            return originFile;
        } else {
            System.out.println("文件重命名失败");
            return null;
        }
    }

    /**
     * 获取先前文件地址, 除自身
     *
     * @param path
     * @return
     */
    public static String getPrePath(String path) {
        String substring = path.substring(0, path.lastIndexOf("\\") + 1);

        String result = "" + substring.charAt(0);
        for (int i = 1; i < substring.length(); i++) {
            result += substring.charAt(i);
            if (substring.charAt(i) == '\\' && substring.charAt(i - 1) != ':') {
                result += "\\";
            }
        }
        return result;
    }

    /**
     * 将文件夹内的所有内容复制到指定位置
     *
     * @param srcDir
     * @param destDir
     */
    public static void copyToDestDir(String srcDir, String destDir) {
        // 创建目标目录
        FileUtil.mkdir(destDir);

        // 获取源目录下的所有文件和目录
        File[] files = FileUtil.ls(srcDir);

        // 遍历源目录下的所有文件和目录，并进行复制
        for (File file : files) {
            if (file.isDirectory()) {
                // 如果是目录，递归调用复制目录的方法
                String subSrcDir = srcDir + File.separator + file.getName();
                String subDestDir = destDir + File.separator + file.getName();
                copyDirectory(subSrcDir, subDestDir);
            } else {
                // 如果是文件，直接调用复制文件的方法
                String srcPath = srcDir + File.separator + file.getName();
                String destPath = destDir + File.separator + file.getName();
                FileUtil.copy(srcPath, destPath, false);
            }
        }
    }

    public static void copyToDestDir(String filePath, String destDir, List<File> files) {
        String srcDir = getPrePath(filePath);

        // 创建目标目录
        FileUtil.mkdir(destDir);

        // 遍历源目录下的所有文件和目录，并进行复制
        for (File file : files) {

            // 如果是文件，直接调用复制文件的方法
            String srcPath = srcDir + File.separator + file.getName();
            String destPath = destDir + File.separator + file.getName();
            FileUtil.copy(srcPath, destPath, false);
        }
    }

    /**
     * 递归复制文件(copy2destDir)
     *
     * @param srcDir
     * @param destDir
     */
    private static void copyDirectory(String srcDir, String destDir) {
        // 创建目标目录
        FileUtil.mkdir(destDir);

        // 获取源目录下的所有文件和目录
        File[] files = FileUtil.ls(srcDir);

        // 遍历源目录下的所有文件和目录，并进行复制
        for (File file : files) {
            if (file.isDirectory()) {
                // 如果是目录，递归调用复制目录的方法
                String subSrcDir = srcDir + File.separator + file.getName();
                String subDestDir = destDir + File.separator + file.getName();
                copyDirectory(subSrcDir, subDestDir);
            } else {
                // 如果是文件，直接调用复制文件的方法
                String srcPath = srcDir + File.separator + file.getName();
                String destPath = destDir + File.separator + file.getName();
                FileUtil.copy(srcPath, destPath, true);
            }
        }
    }

    /**
     * 根据文件删除本地文件
     *
     * @param file
     * @return
     */
    public static boolean delOneFile(File file) {
        return FileUtil.del(file.getPath());
    }

    /**
     * 删除集合文件
     *
     * @param fileList
     * @return
     */
    public static boolean delFileList(List<File> fileList) {
        int count = 0;

        for (int i = 0; i < fileList.size(); i++) {
            if (FileUtil.del(fileList.get(i).getPath())) {
                count++;
            }
        }
        return count == fileList.size();
    }

    /**
     * 去掉路径字符串的双引号
     * @param path
     * @return
     */
    public static String correctPath(String path) {
        // 如果路径有双引号
        if (path.charAt(0) == '\"') {
            // 去掉首尾
            path = path.substring(1, path.length() - 1);

        }
        return path;
    }
}
